package main

import (
	"fmt"
	"time"
)

// LIM 定义了斐波那契数列的最大长度。
const LIM = 41

// fibs 数组用于缓存斐波那契数列的值，以避免重复计算。
var fibs [LIM]uint64

func main() {
	var result uint64 = 0
	// 记录开始时间，用于计算程序执行耗时。
	start := time.Now()
	for i := 0; i < LIM; i++ {
		// 计算并打印第 i 个斐波那契数。
		result = fibonacci1(i)
		fmt.Printf("fibonacci(%d) is: = %d\n", i, result)
	}
	// 记录结束时间，计算并打印程序执行总耗时。
	end := time.Now()
	delta := end.Sub(start)
	fmt.Printf("longCalculation took this amount of time: %s\n", delta)
}

// fibonacci1 计算第 n 个斐波那契数。
// 使用缓存来优化计算性能。
func fibonacci1(n int) (res uint64) {
	// 如果缓存中已存在计算结果，则直接返回。
	if fibs[n] != 0 {
		res = fibs[n]
		return
	}
	// 根据斐波那契数列的定义计算结果。
	if n <= 1 {
		res = 1
	} else {
		res = fibonacci1(n-1) + fibonacci1(n-2)
	}
	// 将计算结果存入缓存。
	fibs[n] = res
	return
}
